#include <cmath> // 数学函数、数学常数
#include <cstdio> // C语言的IO函数：scanf, printf
#include <climits> // 数据类型
#include <iostream> // C++的IO功能
using namespace std;

int main() {
  // https://en.cppreference.com/w/c/io/fprintf
  // 格式串里面%有特殊含义，标识后续对应一个参数的格式。
  printf("meta: %%\n"); // 想输出%本身要双写，不需要参数。这种设计与转义序列的`\\`类似。

  printf("char: %c %c\n", 'A', 65); // 字符Char，传int型字符编码也行。
  printf("char: %c\n", '%'); // 这样输出百分号也行

  printf("string: %s\n", "OK"); // 字串。参数应当是char[]或char*，不能直接传string
  printf("string: %s\n", string("OK").c_str()); // string需要用.c_str()取字符指针

  printf(" int dec: %d\n", INT_MIN); // 整型，十进制（Decimal）
  printf("uint dec: %u\n", -1); // 无符号整型（Unsigned），如果传有符号数，会按无符号数解释。
  printf("uint oct: %o\n", -1); // 八进制（Decimal）无符号数
  printf("uint hex: %x\n", -1); // 十六进制（Hexa-decimal）无符号数，a-f小写
  printf("uint HEX: %X\n", -1); // 同上，但是A-F大写

  printf("      byte: %hhd\n", INT8_MIN); // 8-bit有符号数
  printf("     short: %hd\n", INT16_MAX); // 16-bit有符号数
  printf("      long: %ld\n", LONG_MIN); // 长整型，位数与编译器和环境有关。在GCC@Linux中64-bit，VC则是32-bit。
  printf(" long long: %lld\n", LONG_LONG_MIN); // 通常为64-bit整型
  printf(" miss long: %d\n", LONG_LONG_MIN); // 用错格式串结果可能会乱。%d只显示了低4字节，恰好全是0。

  printf("fp: |%f|\n", M_PI); // 浮点，默认6位小数。
  printf("fp: |%e|\n", M_PI); // 科学计数法，e小写
  printf("fp: |%E|\n", M_PI); // 同上，E大写

  printf("fp-w: |%15f|\n", M_PI); // 指定宽度
  printf("fp-w: |%15e|\n", M_PI);
  printf("fp-w: |%15E|\n", M_PI);

  printf("fp-p: |%.4f|\n", M_PI); // 指定小数位数
  printf("fp-p: |%.4e|\n", M_PI);
  printf("fp-p: |%.4E|\n", M_PI);

  printf("fp-wp: |%8.4f|\n", M_PI); // 总宽度8、小数4位。不足则左侧补0
  printf("fp-wp: |%8.4e|\n", M_PI); // 过宽则原样输出
  printf("fp-wp: |%8.4E|\n", M_PI);

  printf("|%5d|\n", 123);  // 默认右对齐
  printf("|%-5d|\n", 123); // 宽度设为负数就是左对齐
}